home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / wasm201.arc / DOS.MAC < prev    next >
Text File  |  1988-07-17  |  35KB  |  858 lines

  1.  List-
  2.  
  3. ;============================================================================;
  4. ;                             Dos Macro Interface                            ;
  5. ;                                                                            ;
  6. ; The following macros provide an interface with the operating system (DOS). ;
  7. ; Routines are provided here for accessing the keyboard, screen, files, and  ;
  8. ; miscellaneous system utilities. MS or PC DOS 2.0 or higher is required for ;
  9. ; most of the operations.  The file BIOS.MAC provides lower lever routines   ;
  10. ; that allow greater control over similiar types of i/o, independent of DOS. ;
  11. ;                                                                            ;
  12. ; Parameters may be passed as registers, memory operands, immediate data,    ;
  13. ; and strings.  BP should never be used to pass parameters.  Each macro      ;
  14. ; describes its own parameters.  Only the segement registers are guaranteed  ;
  15. ; to be preserved, unless specified otherwise.  The macros do not check to   ;
  16. ; see if their arguments are valid.                                          ;
  17. ;                                                                            ;
  18. ; There are two different recognized formats for strings, a series of ASCII  ;
  19. ; characters preceded a length byte, and a series of ASCII characters        ;
  20. ; terminated by a byte 00.  The first format is used for input and output.   ;
  21. ; The second format is used to pass strings to DOS for opening and closing   ;
  22. ; files. Literal strings that are passed as arguments are automatically      ;
  23. ; declared using the appropriate format.                                     ;
  24. ;                                                                            ;
  25. ; All user i/o is done through the standard output device, i.e. it can be    ;
  26. ; redirected.                                                                ;
  27. ;                                                                            ;
  28. ; DOS functions return return the carry flag set if there was some error     ;
  29. ; during processing (like trying to delete a file that doesn't exist).       ;
  30. ; Unless specified otherwise, the macros will return the flags and registers ;
  31. ; as set by DOS.                                                             ;
  32. ;                                                                            ;
  33. ; The macros IF_EXIST, STRING_OFFSET, and STRING_OFFSETZ are required, and   ;
  34. ; can be found in the file MISC.MAC.                                         ;
  35. ;                                                                            ;
  36. ; The defined macros are:                                                    ;
  37. ;                                                                            ;
  38. ; INPUT_CHAR            input a character                                    ;
  39. ; INPUT_HIDDEN          input a character without echo                       ;
  40. ; INPUT_STRING          input a string                                       ;
  41. ; KEYBOARD_STATUS       get input status                                     ;
  42. ; CLEAR                 clear screen and home cursor (1)                     ;
  43. ; LOCATE                set cursor position (1)                              ;
  44. ; HOME                  cursor home (1)                                      ;
  45. ; LEFT                  cursor left (1)                                      ;
  46. ; RIGHT                 cursor right (1)                                     ;
  47. ; UP                    cursor up (1)                                        ;
  48. ; DOWN                  cursor down (1)                                      ;
  49. ; BELL                  sound speaker                                        ;
  50. ; LINE                  start a new display line                             ;
  51. ; DISPLAY_CHAR          output a character                                   ;
  52. ; DISPLAY_STRING        output a string                                      ;
  53. ; DISPLAY_LINE          output a string and start a new line                 ;
  54. ; NORMAL                set display attribute to normal (1) (2)              ;
  55. ; BOLD                  set display attribute to intense (1) (2)             ;
  56. ; UNDERLINE             set display attribute to underline (1) (2)           ;
  57. ; BLINK                 set display attribute to blinking (1) (2)            ;
  58. ; REVERSE               set display attribute to reverse video (1) (2)       ;
  59. ; OPEN                  open file                                            ;
  60. ; CREATE                create (truncate) file                               ;
  61. ; DELETE                delete file                                          ;
  62. ; WRITE                 write to file                                        ;
  63. ; READ                  read from file                                       ;
  64. ; SEEK                  move a file read/write pointer                       ;
  65. ; SIZE                  return the size of a file                            ;
  66. ; CLOSE                 close file                                           ;
  67. ; TRAP_BREAK            trap user break                                      ;
  68. ; SET_INTERRUPT         set interrupt vector                                 ;
  69. ; GET_INTERRUPT         get interrupt vector                                 ;
  70. ; VERSION               get DOS version                                      ;
  71. ; KEEP                  program terminate but stay resident                  ;
  72. ; EXIT                  program terminate                                    ;
  73. ; DOS_FUNCTION          execute a dos function (through interrupt 21H)       ;
  74. ;                                                                            ;
  75. ; (1) Requires that ANSI.SYS or compatible device driver installed.          ;
  76. ; (2) Display attributes are cumulative execept for resetting to normal      ;
  77. ;     (NORMAL); some of the attributes may be particular to certain          ;
  78. ;     monitors.                                                              ;
  79. ;============================================================================;
  80.  
  81. ;===============================================;
  82. ;                   Input_Char                  ;
  83. ;                                               ;
  84. ; Input a character from standard input. AL     ;
  85. ; returns character.                            ;
  86. ;                                               ;
  87. ; CHAR - optional storage for character: 8 bit  ;
  88. ;   register or memory.                         ;
  89. ;===============================================;
  90.  
  91. Input_Char Macro Char
  92.  Mov Ah,1               ;function number
  93.  Int 21h                ;execute
  94.  If_Exist Char
  95.   Mov Char, Al          ;save character
  96.  Endif
  97.  Endm
  98.  
  99. ;===============================================;
  100. ;                   Input_Hidden                ;
  101. ;                                               ;
  102. ; Input a character from standard input. The    ;
  103. ; character input is not echoed. AL returns     ;
  104. ; character.                                    ;
  105. ;                                               ;
  106. ; CHAR - optional storage for character: 8 bit  ;
  107. ;   register or memory.                         ;
  108. ;===============================================;
  109.  
  110. Input_Hidden Macro Char
  111.  Mov Ah,8               ;function number
  112.  Int 21h                ;execute
  113.  If_Exist Char
  114.   Mov Char, Al          ;save character
  115.  Endif
  116.  Endm
  117.  
  118. ;===============================================;
  119. ;                  Input_String                 ;
  120. ;                                               ;
  121. ; Input a string from standard input. Zero flag ;
  122. ; is set if no string is input. The first byte  ;
  123. ; is its length and it is terminated by a 00.   ;
  124. ;                                               ;
  125. ; LOCATION - storage for string location: 16    ;
  126. ;   bit register or memory.                     ;
  127. ; MAX_LENGTH - absolute maximum length: 8 bit   ;
  128. ;   immediate data.                             ;
  129. ; INP_LENGTH - optional variable maximum        ;
  130. ;   length: 8 bit operand.                      ;
  131. ;                                               ;
  132. ; The variable maximum length must NEVER be     ;
  133. ; longer than the absolute maximum length. If   ;
  134. ; no variable length is specified, the absolute ;
  135. ; maximum length will be used to limit input.   ;
  136. ;===============================================;
  137.  
  138. Input_String Macro Location, Max_Length, Inp_Length
  139.  Jmps SkipBuffer
  140. InputBuffer Label Byte
  141.  Db Max_Length + 1      ;default maximum length
  142.  Db ?                   ;input length
  143.  Ds Max_Length + 1      ;storage
  144. SkipBuffer              ;continue execution after buffer
  145.  If_Exist Inp_Length
  146.   Mov Al, Inp_Length    ;specified length
  147.   Inc Al                ;account for CR
  148.   Mov InputBuffer, Al   ;save
  149.  Endif
  150.  Mov Dx, Offset InputBuffer ;formatted buffer
  151.  Mov Ah, 0ah            ;function
  152.  Int 21h                ;execute
  153.  Line                   ;next display line
  154.  Mov Bl, InputBuffer+1  ;get input length
  155.  Sub Bh, Bh                     ;clear upper byte
  156.  Mov Byte [Bx+InputBuffer+2], 0 ;store 00 on CR
  157.  Mov Location, Offset InputBuffer + 1 ;string body
  158.  Or Bx, Bx                      ;set ZF
  159.  Endm
  160.  
  161. ;===============================================;
  162. ;                Keyboard_Status                ;
  163. ;                                               ;
  164. ; Get the standard input status. AL returns     ;
  165. ; status. Zero flag is set if there are no      ;
  166. ; characters pending.                           ;
  167. ;                                               ;
  168. ; STATUS - optional storage for status: 8 bit   ;
  169. ;   register or memory.                         ;
  170. ;===============================================;
  171.  
  172. Keyboard_Status Macro Status
  173.  Mov Ah,0bh             ;function number
  174.  Int 21h                ;execute
  175.  If_Exist Status
  176.   Mov Status, Al        ;save character
  177.  Endif
  178.  Or Al, Al              ;set ZF
  179.  Endm
  180.  
  181. ;===============================================;
  182. ;                      Clear                    ;
  183. ;                                               ;
  184. ; Clear the screen and home the cursor.         ;
  185. ;===============================================;
  186.  
  187. Clear Macro
  188.  Jmps B                 ;skip control string
  189. A Db 3,27,'[J'          ;ansi control string with length
  190. B Mov Ax, Offset A      ;string location
  191.  Display_String Ax      ;send control code to display
  192.  Endm
  193.  
  194. ;===============================================;
  195. ;                     Locate                    ;
  196. ;                                               ;
  197. ; Move the cursor to a specified position.      ;
  198. ;                                               ;
  199. ; ROW - row position: 8 bit register or         ;
  200. ;   immediate data.                             ;
  201. ; COLUMN - column position: 8 bit register or   ;
  202. ;   immediate data.                             ;
  203. ;                                               ;
  204. ; The row and column number start at one, i.e.  ;
  205. ; the upper left position is row one and column ;
  206. ; one.                                          ;
  207. ;===============================================;
  208.  
  209. Locate Macro Row, Column
  210.  Push Ax
  211.  Push Ax
  212.  Mov Bp, Sp
  213.  Mov Byte [Bp+2], Row   ;set row
  214.  Mov Byte [Bp], Column  ;set column
  215.  Home                   ;move to upper left corner
  216.  Pop Cx
  217.  Sub Ch, Ch             ;only a byte
  218.  Dec Cx                 ;make scale 0 to X
  219.  Jz B                   ;jump if first column
  220. A Push Cx
  221.  Right                  ;move right
  222.  Pop Cx
  223.  Loop A                 ;loop back for each column
  224. B Pop Cx
  225.  Sub Ch, Ch             ;only a byte
  226.  Dec Cx                 ;make scale 0 to X
  227.  Jz C                   ;jump if first row
  228. D Push Cx
  229.  Down                   ;move down
  230.  Pop Cx
  231.  Loop D                 ;loop back for each row
  232. C
  233.  Endm
  234.  
  235. ;===============================================;
  236. ;                      Home                     ;
  237. ;                                               ;
  238. ; Move the cursor to the upper left corner.     ;
  239. ;===============================================;
  240.  
  241. Home Macro
  242.  Jmps B                 ;skip control string
  243. A Db 6,27,'[1;1H'       ;ansi control string with length
  244. B Mov Ax, Offset A      ;string location
  245.  Display_String Ax      ;send control code to display
  246.  Endm
  247.  
  248. ;===============================================;
  249. ;                      Left                     ;
  250. ;                                               ;
  251. ; Move the cursor left one column.              ;
  252. ;===============================================;
  253.  
  254. Left Macro
  255.  Jmps B                 ;skip control string
  256. A Db 3,27,'[D'          ;ansi control string with length
  257. B Mov Ax, Offset A      ;string location
  258.  Display_String Ax      ;send control code to display
  259.  Endm
  260.  
  261. ;===============================================;
  262. ;                      Right                    ;
  263. ;                                               ;
  264. ; Move the cursor right one column.             ;
  265. ;===============================================;
  266.  
  267. Right Macro
  268.  Jmps B                 ;skip control string
  269. A Db 3,27,'[C'          ;ansi control string with length
  270. B Mov Ax, Offset A      ;string location
  271.  Display_String Ax      ;send control code to display
  272.  Endm
  273.  
  274. ;===============================================;
  275. ;                       Up                      ;
  276. ;                                               ;
  277. ; Move the cursor up one row.                   ;
  278. ;===============================================;
  279.  
  280. Up Macro
  281.  Jmps B                 ;skip control string
  282. A Db 3,27,'[A'          ;ansi control string with length
  283. B Mov Ax, Offset A      ;string location
  284.  Display_String Ax      ;send control code to display
  285.  Endm
  286.  
  287. ;===============================================;
  288. ;                       Down                    ;
  289. ;                                               ;
  290. ; Move the cursor down one row.                 ;
  291. ;===============================================;
  292.  
  293. Down Macro
  294.  Jmps B                 ;skip control string
  295. A Db 3,27,'[B'          ;ansi control string with length
  296. B Mov Ax, Offset A      ;string location
  297.  Display_String Ax      ;send control code to display
  298.  Endm
  299.  
  300. ;===============================================;
  301. ;                      Bell                     ;
  302. ;                                               ;
  303. ; Sound the speaker.                            ;
  304. ;===============================================;
  305.  
  306. Bell Macro
  307.  Display_Char 7         ;print a BEL
  308.  Endm
  309.  
  310. ;===============================================;
  311. ;                      Line                     ;
  312. ;                                               ;
  313. ; Start a new diplay line.                      ;
  314. ;===============================================;
  315.  
  316. Line Macro
  317.  Display_Char 13        ;carriage return
  318.  Display_Char 10        ;linefeed
  319.  Endm
  320.  
  321. ;===============================================;
  322. ;                  Display_Char                 ;
  323. ;                                               ;
  324. ; Display a character to standard output.       ;
  325. ;                                               ;
  326. ; CHAR - character to display: 8 bit operand.   ;
  327. ;===============================================;
  328.  
  329. Display_Char Macro Char
  330.  Mov Dl, Char           ;character
  331.  Mov Ah, 2              ;function number
  332.  Int 21h                ;execute
  333.  Endm
  334.  
  335. ;===============================================;
  336. ;                 Display_String                ;
  337. ;                                               ;
  338. ; Display a string to standard output. The      ;
  339. ; first byte must be its length.                ;
  340. ;                                               ;
  341. ; STRING - string to display: literal string or ;
  342. ;   16 bit location of string.                  ;
  343. ;===============================================;
  344.  
  345. Display_String Macro String
  346.  String_Offset String, Bx ;get string offset
  347.  Mov Cl, [Bx]           ;get length byte
  348.  Sub Ch, Ch             ;clear upper byte, CX=length
  349.  Mov Dx, Bx
  350.  Inc Dx                 ;start of string body
  351.  Mov Bx, 1              ;standard output
  352.  Mov Ah, 40h            ;function number
  353.  Int 21h                ;execute
  354.  Endm
  355.  
  356. ;===============================================;
  357. ;                 Display_Line                  ;
  358. ;                                               ;
  359. ; Display a string to standard output and then  ;
  360. ; start a new line. The first byte must be its  ;
  361. ; length.                                       ;
  362. ;                                               ;
  363. ; STRING - string to display: literal string or ;
  364. ;   16 bit location of string.                  ;
  365. ;===============================================;
  366.  
  367. Display_Line Macro String
  368.  String_Offset String, Bx ;get string offset
  369.  Mov Cl, [Bx]           ;get length byte
  370.  Sub Ch, Ch             ;clear upper byte, CX=length
  371.  Mov Dx, Bx
  372.  Inc Dx                 ;start of string body
  373.  Mov Bx, 1              ;standard output
  374.  Mov Ah, 40h            ;function number
  375.  Int 21h                ;execute
  376.  Line                   ;start a new line
  377.  Endm
  378.  
  379. ;===============================================;
  380. ;                     Normal                    ;
  381. ;                                               ;
  382. ; Set display attribute to normal.              ;
  383. ;===============================================;
  384.  
  385. Normal Macro
  386.  Jmps B                 ;skip control string
  387. A Db 4,27,'[0m'         ;ansi control string with length
  388. B Mov Ax, Offset A      ;string location
  389.  Display_String Ax      ;send control code to display
  390.  Endm
  391.  
  392. ;===============================================;
  393. ;                      Bold                     ;
  394. ;                                               ;
  395. ; Set display attribute to bold.                ;
  396. ;===============================================;
  397.  
  398. Bold Macro
  399.  Jmps B                 ;skip control string
  400. A Db 4,27,'[1m'         ;ansi control string with length
  401. B Mov Ax, Offset A      ;string location
  402.  Display_String Ax      ;send control code to display
  403.  Endm
  404.  
  405. ;===============================================;
  406. ;                    Underline                  ;
  407. ;                                               ;
  408. ; Set display attribute to underline.           ;
  409. ;===============================================;
  410.  
  411. Underline Macro
  412.  Jmps B                 ;skip control string
  413. A Db 4,27,'[4m'         ;ansi control string with length
  414. B Mov Ax, Offset A      ;string location
  415.  Display_String Ax      ;send control code to display
  416.  Endm
  417.  
  418. ;===============================================;
  419. ;                     Blink                     ;
  420. ;                                               ;
  421. ; Set display attribute to blink.               ;
  422. ;===============================================;
  423.  
  424. Blink Macro
  425.  Jmps B                 ;skip control string
  426. A Db 4,27,'[5m'         ;ansi control string with length
  427. B Mov Ax, Offset A      ;string location
  428.  Display_String Ax      ;send control code to display
  429.  Endm
  430.  
  431. ;===============================================;
  432. ;                     Reverse                   ;
  433. ;                                               ;
  434. ; Set display attribute to reverse video.       ;
  435. ;===============================================;
  436.  
  437. Reverse Macro
  438.  Jmps B                 ;skip control string
  439. A Db 4,27,'[7m'         ;ansi control string with length
  440. B Mov Ax, Offset A      ;string location
  441.  Display_String Ax      ;send control code to display
  442.  Endm
  443.  
  444. ;===============================================;
  445. ;                      Open                     ;
  446. ;                                               ;
  447. ; Open a file for reading and writing. AX       ;
  448. ; returns the file handle.                      ;
  449. ;                                               ;
  450. ; FILE - file to open: literal string or 16 bit ;
  451. ;  location of string.                          ;
  452. ; HANDLE - optional storage for file handle: 16 ;
  453. ;  bit register or memory.                      ;
  454. ;===============================================;
  455.  
  456. Open Macro File, Handle
  457.  String_Offsetz File, Dx ;get filename offset
  458.  Mov Al, 00000010b      ;read/write status
  459.  Mov Ah, 3dh            ;function number
  460.  Int 21h                ;execute
  461.  If_Exist Handle
  462.   Mov Handle, Ax        ;save handle
  463.  Endif
  464.  Endm
  465.  
  466. ;===============================================;
  467. ;                     Create                    ;
  468. ;                                               ;
  469. ; Create a file for reading and writing. AX     ;
  470. ; returns the file handle.                      ;
  471. ;                                               ;
  472. ; FILE - file to create: literal string or 16   ;
  473. ;  bit location of string.                      ;
  474. ; HANDLE - optional storage for file handle: 16 ;
  475. ;  bit register or memory.                      ;
  476. ;===============================================;
  477.  
  478. Create Macro File, Handle
  479.  String_Offsetz File, Dx ;get filename offset
  480.  Sub Cx, Cx             ;normal attribute
  481.  Mov Ah, 3ch            ;function number
  482.  Int 21h                ;execute
  483.  If_Exist Handle
  484.   Mov Handle, Ax        ;save handle
  485.  Endif
  486.  Endm
  487.  
  488. ;===============================================;
  489. ;                     Delete                    ;
  490. ;                                               ;
  491. ; Delete a file.                                ;
  492. ;                                               ;
  493. ; FILE - file to delete: literal string or 16   ;
  494. ;  bit location of string.                      ;
  495. ;===============================================;
  496.  
  497. Delete Macro File
  498.  String_Offsetz File, Dx ;get filename offset
  499.  Mov Ah, 41h            ;function number
  500.  Int 21h                ;execute
  501.  Endm
  502.  
  503. ;===============================================;
  504. ;                      Write                    ;
  505. ;                                               ;
  506. ; Write to a file. AX returns the number of     ;
  507. ; bytes written.                                ;
  508. ;                                               ;
  509. ; HANDLE - file handle: 16 bit register or      ;
  510. ;   immediate data.                             ;
  511. ; BYTES - number of bytes to write: 16 bit      ;
  512. ;   register or immediate data.                 ;
  513. ; LOCATION - location of bytes to write: 16 bit ;
  514. ;   register or immediate data.                 ;
  515. ; RETURN - optional storage for the number of   ;
  516. ;   bytes written: 16 bit register or memory.   ;
  517. ;===============================================;
  518.  
  519. Write Macro Handle, Bytes, Location, Return
  520.  Push Bx
  521.  Push Cx
  522.  Push Dx                ;parameters on stack
  523.  Mov Bp, Sp
  524.  Mov Word [Bp+4], Handle ;handle
  525.  Mov Word [Bp+2], Bytes  ;bytes to write
  526.  Mov Word [Bp], Location ;location of buffer
  527.  Pop Dx
  528.  Pop Cx
  529.  Pop Bx                 ;restore parameters
  530.  Mov Ah, 40h            ;function number
  531.  Int 21h                ;execute
  532.  If_Exist Return
  533.   Mov Return, Ax        ;save bytes written
  534.  Endif
  535.  Endm
  536.  
  537. ;===============================================;
  538. ;                      Read                     ;
  539. ;                                               ;
  540. ; Read from a file. AX returns the number of    ;
  541. ; bytes read.                                   ;
  542. ;                                               ;
  543. ; HANDLE - file handle: 16 bit register or      ;
  544. ;   immediate data.                             ;
  545. ; BYTES - number of bytes to read: 16 bit       ;
  546. ;   register or immediate data.                 ;
  547. ; LOCATION - location to put bytes read: 16 bit ;
  548. ;   register or immediate data.                 ;
  549. ; RETURN - optional storage for the number of   ;
  550. ;   bytes read: 16 bit register or memory.      ;
  551. ;===============================================;
  552.  
  553. Read Macro Handle, Bytes, Location, Return
  554.  Push Bx
  555.  Push Cx
  556.  Push Dx                ;parameters on stack
  557.  Mov Bp, Sp
  558.  Mov Word [Bp+4], Handle ;handle
  559.  Mov Word [Bp+2], Bytes  ;bytes to read
  560.  Mov Word [Bp], Location ;location of buffer
  561.  Pop Dx
  562.  Pop Cx
  563.  Pop Bx                 ;restore parameters
  564.  Mov Ah, 3fh            ;function number
  565.  Int 21h                ;execute
  566.  If_Exist Return
  567.   Mov Return, Ax        ;save bytes read
  568.  Endif
  569.  Endm
  570.  
  571. ;===============================================;
  572. ;                      Seek                     ;
  573. ;                                               ;
  574. ; Move the read/write pointer of a file to a    ;
  575. ; specified record location.                    ;
  576. ;                                               ;
  577. ; HANDLE - file handle: 16 bit register or      ;
  578. ;   immediate data.                             ;
  579. ; RECORD_HIGH - optional high word of record    ;
  580. ;   number to find: 16 bit register or          ;
  581. ;   immediate data.                             ;
  582. ; RECORD_LOW - optional low word of record      ;
  583. ;   number to find: 16 bit register or          ;
  584. ;   immediate data.                             ;
  585. ; RECORD_SIZE - optional size of records in     ;
  586. ;   file: 16 bit register or immediate data.    ;
  587. ;                                               ;
  588. ; If the record high or low number is not       ;
  589. ; specified, zero is substituted.  If record    ;
  590. ; size is not specified, one is substituted.    ;
  591. ; The first record is record number zero. Using ;
  592. ; SEEK without the record size turns the record ;
  593. ; number into an absolute 32 bit offset         ;
  594. ; from the beginning of the file. If only the   ;
  595. ; handle is present, the SEEK will move the     ;
  596. ; read/write pointer to the start of file.      ;
  597. ;===============================================;
  598.  
  599. Seek Macro Handle, Record_High, Record_Low, Record_Size
  600.  Push Ax
  601.  Push Bx
  602.  Push Cx
  603.  Push Dx                ;parameters on stack
  604.  Mov Bp, Sp
  605.  Mov Word [Bp+4], Handle ;handle
  606.  If_Exist Record_High
  607.   Mov Word [Bp], Record_High ;record number, high word
  608.  Else
  609.   Mov Word [Bp], 0      ;record number, high word
  610.  Endif
  611.  If_Exist Record_Low
  612.   Mov Word [Bp+6], Record_Low ;record number, low word
  613.  Else
  614.   Mov Word [Bp+6], 0    ;record number, low word
  615.  Endif
  616.  If_Exist Record_Size
  617.   Mov Word [Bp+2], Record_Size ;record size
  618.  Else
  619.   Mov Word [Bp+2], 1    ;record size
  620.  Endif
  621.  Pop Dx
  622.  Pop Cx
  623.  Pop Bx
  624.  Pop Ax                 ;restore parameters
  625.  Mul Ax, Cx             ;get offset, DX.AX * CX
  626.  Mov Cx, Ax
  627.  Xchg Cx, Dx            ;offset into CX.DX
  628.  Mov Ax, 4200h          ;function number and position method
  629.  Int 21h                ;execute
  630.  Endm 
  631.  
  632. ;===============================================;
  633. ;                      Size                     ;
  634. ;                                               ;
  635. ; Return the size of a file and move the read/  ;
  636. ; write pointer to the end of the file. DX      ;
  637. ; returns the high (most significant) word of   ;
  638. ; the file size and AX returns the low (least   ;
  639. ; significant) word of the file size.           ;
  640. ;                                               ;
  641. ; HANDLE - file handle: 16 bit register or      ;
  642. ;   immediate data.                             ;
  643. ; HIGH_WORD - optional storage for the high     ;
  644. ;   word: 16 bit register or memory.            ;
  645. ; LOW_WORD - optional storage for the low word: ;
  646. ;   16 bit register or memory.                  ;
  647. ;===============================================;
  648.  
  649. Size Macro Handle, High_Word, Low_Word
  650.  Mov Bx, Handle         ;set handle
  651.  Sub Cx, Cx
  652.  Mov Dx, Cx             ;move to offset from end 0000.0000
  653.  Mov Ax, 4202h          ;function number and position method
  654.  Int 21h                ;execute
  655.  If_Exist High_Word
  656.   Mov High_Word, Dx     ;save most significant word
  657.  Endif
  658.  If_Exist Low_Word
  659.   Mov Low_Word, Ax      ;save least significant word
  660.  Endif
  661.  Endm
  662.  
  663. ;===============================================;
  664. ;                      Close                    ;
  665. ;                                               ;
  666. ; Close a file.                                 ;
  667. ;                                               ;
  668. ; HANDLE - file handle: 16 bit register or      ;
  669. ;   immediate data.                             ;
  670. ;===============================================;
  671.  
  672. Close Macro Handle
  673.  Mov Bx, Handle         ;set handle
  674.  Mov Ah, 3eh            ;function number
  675.  Int 21h                ;execute
  676.  Endm
  677.  
  678. ;===============================================;
  679. ;                  Trap_Break                   ;
  680. ;                                               ;
  681. ; Set up a routine to service a system break    ;
  682. ; and thus allow a program to retain control in ;
  683. ; event that the user enters a Ctrl Break.      ;
  684. ; Assumes that the routine is in the DS         ;
  685. ; segement. The modified interrupt vector (23H) ;
  686. ; is automatically restored by the system when  ;
  687. ; the program terminates (i.e. it does not have ;
  688. ; to be saved and later restored).              ;
  689. ;                                               ;
  690. ; ROUTINE - routine to handle break: routine    ;
  691. ;   name (far label) or 16 bit register or      ;
  692. ;   immediate data.                             ;
  693. ;===============================================;
  694.  
  695. Trap_break Macro Routine
  696. Dummy Label Far         ;this is only for testing purposes
  697.  If Type(Routine) And Type(Dummy)
  698.   Set_Interrupt 23h, Ds, Offset Routine ;set interrupt
  699.  Else                                                 
  700.   Set_Interrupt 23h, Ds, Routine ;set interrupt
  701.  Endif
  702.  Endm
  703.  
  704. ;===============================================;
  705. ;                  Set_Interrupt                ;
  706. ;                                               ;
  707. ; Set the specified interrupt vector. DS is     ;
  708. ; destroyed if the segment is different than    ;
  709. ; the initial DS value.                         ;
  710. ;                                               ;
  711. ; INT_NUM - interrupt number to set: 8 bit      ;
  712. ;   register or immediate data.                 ;
  713. ; SEGMENT - segement value: 16 bit register or  ;
  714. ;   immediate data.                             ;
  715. ; OFFSET - offset value: 16 bit register or     ;
  716. ;   immediate data.                             ;
  717. ;===============================================;
  718.  
  719. Set_Interrupt Macro Int_Num, Segment, Offset
  720.  Push Ax
  721.  Push Ds
  722.  Push Dx                ;parameters on stack
  723.  Mov Bp, Sp
  724.  Mov Byte [Bp+4], Int_Num ;vector to set
  725.  Mov Word [Bp+2], Segment ;segment
  726.  Mov Word [Bp], Offset    ;offset
  727.  Pop Dx
  728.  Pop Ds
  729.  Pop Ax                 ;restore parameters
  730.  Mov Ah, 25h            ;function number
  731.  Int 21h                ;execute
  732.  Endm
  733.  
  734. ;===============================================;
  735. ;                  Get_Interrupt                ;
  736. ;                                               ;
  737. ; Get the segement and offset of the specified  ;
  738. ; interrupt number. ES:BX return the location   ;
  739. ; (ES is destroyed).                            ;
  740. ;                                               ;
  741. ; INT_NUM - interrupt number to get: 8 bit      ;
  742. ;   register or memory.                         ;
  743. ; SEGMENT - optional storage for segement: 16   ;
  744. ;   bit register or memory.                     ;
  745. ; OFFSET - optional storage for offset: 16 bit  ;
  746. ;   register or memory.                         ;
  747. ;===============================================;
  748.  
  749. Get_Interrupt Macro Int_Num, Segment, Offset
  750.  Mov Al, Int_Num        ;vector to set
  751.  Mov Ah, 35h            ;function number
  752.  Int 21h                ;execute
  753.  If_Exist Segment
  754.   Mov Segment, Es       ;save segment
  755.  Endif
  756.  If_Exist Offset
  757.   Mov Offset, Bx        ;save offset
  758.  Endif
  759.  Endm
  760.  
  761. ;===============================================;
  762. ;                    Version                    ;
  763. ;                                               ;
  764. ; Return the present MS/PC DOS version number.  ;
  765. ; AL returns the primary version, AH returns    ;
  766. ; the secondary version. The version is zero if ;
  767. ; pre-DOS 2.0.                                  ;
  768. ;                                               ;
  769. ; VERSION - optional storage for the entire     ;
  770. ;   version word: 16 bit register or memory.    ;
  771. ;===============================================;
  772.  
  773. Version Macro Version
  774.  Mov Ah, 30h            ;function number
  775.  Int 21h                ;execute
  776.  If_Exist Version
  777.   Mov Version, Ax       ;save
  778.  Endif
  779.  Endm
  780.  
  781. ;===============================================;
  782. ;                      Keep                     ;
  783. ;                                               ;
  784. ; Program terminate and stay resident.          ;
  785. ;                                               ;
  786. ; SIZE - number of paragraphs to reserve: 16    ;
  787. ;   bit register or immediate data.             ;
  788. ; ERR_CODE - optional error code: 8 bit         ;
  789. ;   register or immediate data.                 ;
  790. ;                                               ;
  791. ; An error code of zero is returned if none is  ;
  792. ; specified.                                    ;
  793. ;===============================================;
  794.  
  795. Keep Macro Size, Err_Code
  796.  Push Ax
  797.  Push Dx
  798.  Mov Bp, Sp
  799.  Mov Word [Bp], Size    ;paragraphs to reserve
  800.  If_Exist Err_Code
  801.   Mov Byte [Bp+2], Err_Code ;set error code
  802.  Else
  803.   Mov Byte [Bp+2], 0    ;error code zero
  804.  Endif
  805.  Pop Dx
  806.  Pop Ax
  807.  Mov Ah, 31h            ;function number
  808.  Int 21h                ;execute
  809.  Endm
  810.  
  811. ;===============================================;
  812. ;                      Exit                     ;
  813. ;                                               ;
  814. ; Program termination.                          ;
  815. ;                                               ;
  816. ; ERR_CODE - optional error code: 8 bit         ;
  817. ; operand.                                      ;
  818. ;                                               ;
  819. ; An error code of zero is returned if none is  ;
  820. ; specified.                                    ;
  821. ;===============================================;
  822.  
  823. Exit Macro Err_Code
  824.  If_Exist Err_Code
  825.   Mov Al, Err_Code      ;set error code
  826.  Else
  827.   Sub Al, Al            ;error code zero
  828.  Endif
  829.  Mov Ah, 4ch            ;function number
  830.  Int 21h                ;execute
  831.  Endm
  832.  
  833. ;===============================================;
  834. ;                  Dos_Function                 ;
  835. ;                                               ;
  836. ; Execute a DOS function with a subfunction.    ;
  837. ; The function and subfunction are the values   ;
  838. ; that are to be placed in AH and AL            ;
  839. ; respectively.                                 ;
  840. ;                                               ;
  841. ; FUNC_NUM1 - main function (AH): 8 bit         ;
  842. ;   register or immediate data.                 ;
  843. ; FUNC_NUM2 - optional secondary fuction (AL):  ;
  844. ;   8 bit register or immediate data.           ;
  845. ;===============================================;
  846.  
  847. Dos_Function Macro Func_Num1, Func_Num2
  848.  Push Ax                ;parameters on stack
  849.  Mov Bp, Sp
  850.  Mov Byte [Bp+1], Func_Num1 ;set function (AH)
  851.  If_Exist Func_Num2
  852.   Mov Byte [Bp], Func_Num2  ;set subfunction (AL)
  853.  Endif
  854.  Pop Ax                 ;restore parameters
  855.  Int 21h                ;execute
  856.  Endm
  857.  
  858.